iT邦幫忙

0

[OpenCV 學習筆記] 4. 透過遮罩(Mask)將去背圖片嵌入其他圖片!

  • 分享至 

  • xImage
  •  

本文將簡單示範如何使用 OpenCV 透過遮罩(Mask)將去背圖片嵌入其他圖片,達成影像合成的效果。
如下圖所示:
https://ithelp.ithome.com.tw/upload/images/20260820/20182893qTHLw1BSNn.png


範例圖片:

  • dog.png
    https://ithelp.ithome.com.tw/upload/images/20260820/20182893aZRZwOKEAK.png
  • yourpic.jpg
    https://ithelp.ithome.com.tw/upload/images/20260820/20182893V7DGSwo7Rl.jpg

流程:
https://ithelp.ithome.com.tw/upload/images/20260820/20182893FoOMYShEes.png

程式碼(Python):

import cv2
import numpy as np
import matplotlib.pyplot as plt

dog_pic = '../images/dog.png' # 圖片位址
your_pic = '../images/yourpic.jpg' # 圖片位址

try:
    # 讀取圖片
    dog_img = cv2.imread(dog_pic) 
    your_pic_img = cv2.imread(your_pic) 
    your_pic_img = cv2.resize(your_pic_img, (dog_img.shape[1], dog_img.shape[0])) # resize 圖片,確保兩張圖片同樣大小

    # 將圖片轉成灰階圖片
    dog_img_gray = cv2.cvtColor(dog_img, cv2.COLOR_BGR2GRAY) 

    # 取得 mask
    ret, mask = cv2.threshold(dog_img_gray, 220, 255, cv2.THRESH_BINARY)
    mask_inv = cv2.bitwise_not(mask) 

    # 透過 mask 取得背景圖片和將去背圖圖片的背景反黑
    your_pic_background = cv2.bitwise_and(your_pic_img, your_pic_img,mask = mask)
    dog = cv2.bitwise_and(dog_img, dog_img, mask = mask_inv)

    # 將兩張圖片的像素值一一疊加,Note: 黑色像素值是 [0, 0, 0],所以任一像素疊加 [0,0,0] 等於自己本身
    # 因此兩張圖片會各自保留其不是黑色色塊的部分後疊再一起
    result = cv2.add(dog, your_pic_background)

    # 將過程中產生的圖片畫出來
    pic_titles = ['dog_img_gray', 'mask', 'mask_inv', 'your_pic_background', 'dog', 'result']
    bgr_images= [dog_img_gray, mask, mask_inv, your_pic_background, dog, result]
    rgb_images = [cv2.cvtColor(img, cv2.COLOR_BGR2RGB) for img in bgr_images]

    for i in range(6):
        plt.subplot(2,3,i+1),plt.imshow(rgb_images[i])
        plt.title(pic_titles[i])
        plt.xticks([]),plt.yticks([]) # 拿掉 X座標軸 和 y座標軸 刻度文字

    plt.show()

except Exception as ex:
    print(f"An unexpected error occurred: {ex}")

過程中產生的圖片:
https://ithelp.ithome.com.tw/upload/images/20260820/20182893ZYalkD2Xyz.png

Note:

  • CV2.threshold 方法的 thresh 輸入不同的閥值可以擷取到不同的特徵和輪廓,詳見
    官網說明文件
    https://ithelp.ithome.com.tw/upload/images/20260820/2018289332lszKaR2c.png

  • 將程式內的 threshold 方法的 type 改成 THRESH_BINARY_INV,則可得到剪影。
    https://ithelp.ithome.com.tw/upload/images/20260820/20182893MihxFHK5V2.png


以上就是關於去背圖片合成的示範,希望對看到這篇文章的讀者有幫助,謝謝~~~


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言